package 多线程初阶.示例测试;

/**
 * synchronized是可重入锁
 */
public class TestDemo14 {
    static class Count{
        public int count=0;
        synchronized void increase1(){
            count++;
        }
        synchronized  void increase2(){
            increase1();
        }
    }
    public static void main(String[] args) {
        final Count count=new Count();
        count.increase2();
        /**
         * 可重入锁内部实现包括线程持有者和计数器
         * 调用increase2,先给count对象加了一把锁,然后锁计数器++,并且记录锁的持有者是线程main
         * 调用increase1,判断得知当前锁的持有者是同一个线程,于是继续加了一把锁,锁计数器++,然后执行count++
         * increase1执行完毕,解锁,锁计数器--
         * increase2执行完毕,解锁,锁计数器再--
         * 此时计数器为0,锁也就释放了,可被其余线程所抢占了
         */
    }
}
